// 并查集模版(牛客)
// 路径压缩 + 小挂大
// 测试链接 : https://www.nowcoder.com/practice/e7ed657974934a30b2010046536a5372
// 提交以下所有代码，可以直接通过

#include <cstdio>

const int MAXN = 1e6 + 1;

int father[MAXN];
int size[MAXN];
int st[MAXN];

int n, m;

void Build()
{
    for(int i = 0; i <= n; ++i)
    {
        father[i] = i;
        size[i] = 1;
    }
}

// i 号节点，往上一直找，找到代表节点返回！
int Find(int i)
{
    // 沿途收集了几个点
    int sz = 0;
    while(i != father[i])
    {
        st[sz++] = i;
        i = father[i];
    }
    // 沿途节点收集好了，i 已经跳到代表节点了
    while(sz > 0)
    {
        father[st[--sz]] = i;
    }
    return i;
}

bool isSameSet(int x, int y)
{
    return Find(x) == Find(y);
}

void Union(int x, int y)
{
    int fx = Find(x);
    int fy = Find(y);
    if (fx != fy) 
    {
        // fx 是集合的代表：拿大小
        // fy 是集合的代表：拿大小
        // 集合小的合并到集合大的中去，目的是让高度变得更小
        if (size[fx] >= size[fy]) 
        {
            size[fx] += size[fy];
            father[fy] = fx;
        } else 
        {
            size[fy] += size[fx];
            father[fx] = fy;
        }
    }
}

int main()
{
    scanf("%d%d", &n, &m);
    Build();
    for(int i = 0; i < m; ++i)
    {
        int opt, x, y;
        scanf("%d%d%d", &opt, &x, &y);
        if(opt == 1)
        {
            if(isSameSet(x, y)) printf("Yes\n");
            else printf("No\n");
        }
        else
            Union(x, y);
    }

    return 0;
}